import {
  Injectable,
  NestInterceptor,
  ExecutionContext,
  CallHandler,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { R, ResponseMessage } from '../response/response.util';

/**
 * 响应拦截器
 * 用于统一处理控制器返回的响应
 */
@Injectable()
export class ResponseInterceptor implements NestInterceptor {
  /**
   * 拦截方法
   * @param context 执行上下文
   * @param next 调用处理器
   * @returns Observable
   */
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    // 获取请求对象
    const request = context.switchToHttp().getRequest();

    // 处理响应
    return next.handle().pipe(
      map((data) => {
        // 自动添加缓存控制头（开发环境禁用缓存）
        const res = context.switchToHttp().getResponse();
        res.setHeader('Cache-Control', 'no-store, max-age=0');

        // 如果返回的数据已经是标准响应格式，则直接返回
        if (data && data.code !== undefined && data.message !== undefined) {
          return data;
        }

        // 否则，包装成标准响应格式
        return R.ok(data);
      }),
    );
  }
}
